package com.barnabe;

import com.barnabe.filters.ImageToolkit;
import com.barnabe.filters.Subtracao;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Calendar;
import javax.swing.JList;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 *
 * @author zanona
 */
public class IdentificarVeiculo {

    public static JTextArea log;
    public static JTextArea log2;
    public static JTextArea log3;
    public static JTextArea log4;
    public static JList pistaUm;
    public static JList pistaDois;
    public static JList pistaTres;
    public static JList pistaQuatro;
    public static JTextField TxAceitacaoInicioPista1;
    public static JTextField TxAceitacaoInicioPista2;
    public static JTextField TxAceitacaoInicioPista3;
    public static JTextField TxAceitacaoInicioPista4;
    public static JTextField TxAceitacaoFimPista1;
    public static JTextField TxAceitacaoFimPista2;
    public static JTextField TxAceitacaoFimPista3;
    public static JTextField TxAceitacaoFimPista4;
    public static boolean achou;
    public static boolean achouPista2;
    public static boolean achouPista3;
    public static boolean achouPista4;
    public static boolean saiu;
    public static boolean saiuPista2;
    public static boolean saiuPista3;
    public static boolean saiuPista4;
    public static ArrayList<Double> lista;
    public static ArrayList<Double> listaPista2;
    public static ArrayList<Double> listaPista3;
    public static ArrayList<Double> listaPista4;
    private static Integer[][][][] limitePista = new Integer[][][][]{
        // pista um
        {{{233, 177}, {256, 179}}, {{213, 136}, {231, 138}}},
        // pista dois
        {{{263, 167}, {285, 168}}, {{237, 133}, {248, 134}}},
        // pista tres
        {{{248, 129}, {262, 130}}, {{288, 166}, {307, 167}}},
        // pista quatro
        {{{265, 127}, {279, 128}}, {{292, 148}, {313, 149}}}
    };

    public static boolean encontrar(BufferedImage imagem) {
        // taxa que ira considerar a presenca ou nao de um carro
        int txAceitacaoInicio = TxAceitacaoInicioPista1.getText().equals("") ? -1200 : Integer.parseInt(TxAceitacaoInicioPista1.getText());
        int txAceitacaoFim = TxAceitacaoFimPista1.getText().equals("") ? -1000 : Integer.parseInt(TxAceitacaoFimPista1.getText());
        int txAceitacaoInicio2 = TxAceitacaoInicioPista2.getText().equals("") ? -1100 : Integer.parseInt(TxAceitacaoInicioPista2.getText());
        int txAceitacaoFim2 = TxAceitacaoFimPista2.getText().equals("") ? -500 : Integer.parseInt(TxAceitacaoFimPista2.getText());
        int txAceitacaoInicio3 = TxAceitacaoInicioPista3.getText().equals("") ? -1100 : Integer.parseInt(TxAceitacaoInicioPista3.getText());
        int txAceitacaoFim3 = TxAceitacaoFimPista3.getText().equals("") ? -500 : Integer.parseInt(TxAceitacaoFimPista3.getText());
        int txAceitacaoInicio4 = TxAceitacaoInicioPista4.getText().equals("") ? -1100 : Integer.parseInt(TxAceitacaoInicioPista4.getText());
        int txAceitacaoFim4 = TxAceitacaoFimPista4.getText().equals("") ? -500 : Integer.parseInt(TxAceitacaoFimPista4.getText());

        //Variaval para pegar o tempo da parada!
        Calendar data = Calendar.getInstance();

        // para pista 1
        final int txPistaUmInicio = Subtracao.diferencaEntre(imagem, ImageToolkit.getImagemPonteVazia(), limitePista[0][0][0][0], limitePista[0][0][0][1], limitePista[0][0][1][0], limitePista[0][0][1][1]);
        final int txPistaUmFim = Subtracao.diferencaEntre(imagem, ImageToolkit.getImagemPonteVazia(), limitePista[0][1][0][0], limitePista[0][1][0][1], limitePista[0][1][1][0], limitePista[0][1][1][1]);
        // para pista 2
        final int txPistaDoisInicio = Subtracao.diferencaEntre(imagem, ImageToolkit.getImagemPonteVazia(), limitePista[1][0][0][0], limitePista[1][0][0][1], limitePista[1][0][1][0], limitePista[1][0][1][1]);
        final int txPistaDoisFim = Subtracao.diferencaEntre(imagem, ImageToolkit.getImagemPonteVazia(), limitePista[1][1][0][0], limitePista[1][1][0][1], limitePista[1][1][1][0], limitePista[1][1][1][1]);
        // para pista 3
        final int txPistaTresInicio = Subtracao.diferencaEntre(imagem, ImageToolkit.getImagemPonteVazia(), limitePista[2][0][0][0], limitePista[2][0][0][1], limitePista[2][0][1][0], limitePista[2][0][1][1]);
        final int txPistaTresFim = Subtracao.diferencaEntre(imagem, ImageToolkit.getImagemPonteVazia(), limitePista[2][1][0][0], limitePista[2][1][0][1], limitePista[2][1][1][0], limitePista[2][1][1][1]);
        // para pista 4
        final int txPistaQuatroInicio = Subtracao.diferencaEntre(imagem, ImageToolkit.getImagemPonteVazia(), limitePista[3][0][0][0], limitePista[3][0][0][1], limitePista[3][0][1][0], limitePista[3][0][1][1]);
        final int txPistaQuatroFim = Subtracao.diferencaEntre(imagem, ImageToolkit.getImagemPonteVazia(), limitePista[3][1][0][0], limitePista[3][1][0][1], limitePista[3][1][1][0], limitePista[3][1][1][1]);

        pistaUm.setModel(new javax.swing.AbstractListModel() {

            String[] strings = {Integer.toString(txPistaUmInicio), Integer.toString(txPistaUmFim)};

            public int getSize() {
                return strings.length;
            }

            public Object getElementAt(int i) {
                return strings[i];
            }
        });

        pistaDois.setModel(new javax.swing.AbstractListModel() {

            String[] strings = {Integer.toString(txPistaDoisInicio), Integer.toString(txPistaDoisFim)};

            public int getSize() {
                return strings.length;
            }

            public Object getElementAt(int i) {
                return strings[i];
            }
        });

        pistaTres.setModel(new javax.swing.AbstractListModel() {

            String[] strings = {Integer.toString(txPistaTresInicio), Integer.toString(txPistaTresFim)};

            public int getSize() {
                return strings.length;
            }

            public Object getElementAt(int i) {
                return strings[i];
            }
        });

        pistaQuatro.setModel(new javax.swing.AbstractListModel() {

            String[] strings = {Integer.toString(txPistaQuatroInicio), Integer.toString(txPistaQuatroFim)};

            public int getSize() {
                return strings.length;
            }

            public Object getElementAt(int i) {
                return strings[i];
            }
        });

        // aqui eu ja sei quem entrou e quem saiu a cada recepcao do frame

        //PISTA 1
        if (txPistaUmInicio < txAceitacaoInicio) {
            // chegou carro pista um
            if (!achou) {
                achou = true;
                log.append("Entrada 1 :: " + txPistaUmInicio + " :: " + data.get(Calendar.HOUR) + ":" + data.get(Calendar.MINUTE) + ":" + data.get(Calendar.SECOND) + ":" + data.get(Calendar.MILLISECOND) + "\n");
                Double ms = Double.parseDouble("0." + Integer.toString(data.get(Calendar.MILLISECOND))) / 1000;
                lista.add(Double.parseDouble(Integer.toString(data.get(Calendar.SECOND))) + ms);
            }
        } else {
            achou = false;
        }
        if (txPistaUmFim < txAceitacaoFim) {
            //achou carro saindo
            if (!saiu) {
                saiu = true;
                log.append("SAIDA 1 :: " + txPistaUmFim + " :: " + data.get(Calendar.HOUR) + ":" + data.get(Calendar.MINUTE) + ":" + data.get(Calendar.SECOND) + ":" + data.get(Calendar.MILLISECOND) + "\n");
                Double segundosEntrada = lista.get(0);
                Double ms = Double.parseDouble("0." + Integer.toString(data.get(Calendar.MILLISECOND))) / 1000;
                Double segundosSaida = Double.parseDouble(Integer.toString(data.get(Calendar.SECOND))) + ms;
                log.append("Velocidade do carro: " + ((30 / (segundosSaida - segundosEntrada)) * 3.6) + "Km/h\n");
                lista.remove(0);
            }
        } else {
            saiu = false;
        }

        //PISTA 2
        if (txPistaDoisInicio < txAceitacaoInicio2) {
            // chegou carro pista dois
            if (!achouPista2) {
                achouPista2 = true;
                log2.append("Entrada 2 :: " + txPistaUmInicio + " :: " + data.get(Calendar.HOUR) + ":" + data.get(Calendar.MINUTE) + ":" + data.get(Calendar.SECOND) + ":" + data.get(Calendar.MILLISECOND) + "\n");
                Double ms = Double.parseDouble("0." + Integer.toString(data.get(Calendar.MILLISECOND))) / 1000;
                listaPista2.add(Double.parseDouble(Integer.toString(data.get(Calendar.SECOND))) + ms);
            }
        } else {
            achouPista2 = false;
        }
        if (txPistaDoisFim < txAceitacaoFim2) {
            //achou carro saindo
            if (!saiuPista2) {
                saiuPista2 = true;
                log2.append("Saida 2 :: " + txPistaUmFim + " :: " + data.get(Calendar.HOUR) + ":" + data.get(Calendar.MINUTE) + ":" + data.get(Calendar.SECOND) + ":" + data.get(Calendar.MILLISECOND) + "\n");
                Double segundosEntrada = listaPista2.get(0);
                Double ms = Double.parseDouble("0." + Integer.toString(data.get(Calendar.MILLISECOND))) / 1000;
                Double segundosSaida = Double.parseDouble(Integer.toString(data.get(Calendar.SECOND))) + ms;
                log2.append("Velocidade do carro 2: " + ((30 / (segundosSaida - segundosEntrada)) * 3.6) + "Km/h\n");
                listaPista2.remove(0);
            }
        } else {
            saiuPista2 = false;
        }

        //PISTA 3
        if (txPistaDoisInicio < txAceitacaoInicio3) {
            // chegou carro pista dois
            if (!achouPista3) {
                achouPista3 = true;
                log3.append("Entrada 3 :: " + txPistaUmInicio + " :: " + data.get(Calendar.HOUR) + ":" + data.get(Calendar.MINUTE) + ":" + data.get(Calendar.SECOND) + ":" + data.get(Calendar.MILLISECOND) + "\n");
                Double ms = Double.parseDouble("0." + Integer.toString(data.get(Calendar.MILLISECOND))) / 1000;
                listaPista3.add(Double.parseDouble(Integer.toString(data.get(Calendar.SECOND))) + ms);
            }
        } else {
            achouPista3 = false;
        }
        if (txPistaDoisFim < txAceitacaoFim3) {
            //achou carro saindo
            if (!saiuPista3) {
                saiuPista3 = true;
                log3.append("Saida 3 :: " + txPistaUmFim + " :: " + data.get(Calendar.HOUR) + ":" + data.get(Calendar.MINUTE) + ":" + data.get(Calendar.SECOND) + ":" + data.get(Calendar.MILLISECOND) + "\n");
                Double segundosEntrada = listaPista3.get(0);
                Double ms = Double.parseDouble("0." + Integer.toString(data.get(Calendar.MILLISECOND))) / 1000;
                Double segundosSaida = Double.parseDouble(Integer.toString(data.get(Calendar.SECOND))) + ms;
                log3.append("Velocidade : " + ((30 / (segundosSaida - segundosEntrada)) * 3.6) + "Km/h\n");
                listaPista3.remove(0);
            }
        } else {
            saiuPista2 = false;
        }

        //PISTA 4
        if (txPistaDoisInicio < txAceitacaoInicio4) {
            // chegou carro pista dois
            if (!achouPista4) {
                achouPista4 = true;
                log4.append("Entrada 4 :: " + txPistaUmInicio + " :: " + data.get(Calendar.HOUR) + ":" + data.get(Calendar.MINUTE) + ":" + data.get(Calendar.SECOND) + ":" + data.get(Calendar.MILLISECOND) + "\n");
                Double ms = Double.parseDouble("0." + Integer.toString(data.get(Calendar.MILLISECOND))) / 1000;
                listaPista4.add(Double.parseDouble(Integer.toString(data.get(Calendar.SECOND))) + ms);
            }
        } else {
            achouPista4 = false;
        }
        if (txPistaDoisFim < txAceitacaoFim4) {
            //achou carro saindo
            if (!saiuPista4) {
                saiuPista4 = true;
                log4.append("Saida 4 :: " + txPistaUmFim + " :: " + data.get(Calendar.HOUR) + ":" + data.get(Calendar.MINUTE) + ":" + data.get(Calendar.SECOND) + ":" + data.get(Calendar.MILLISECOND) + "\n");
                Double segundosEntrada = listaPista4.get(0);
                Double ms = Double.parseDouble("0." + Integer.toString(data.get(Calendar.MILLISECOND))) / 1000;
                Double segundosSaida = Double.parseDouble(Integer.toString(data.get(Calendar.SECOND))) + ms;
                log4.append("Velocidade : " + ((30 / (segundosSaida - segundosEntrada)) * 3.6) + "Km/h\n");
                listaPista4.remove(0);
            }
        } else {
            saiuPista2 = false;
        }

        return false;

    }
}